
from django_redis import get_redis_connection
from rest_framework.response import Response
from rest_framework.views import APIView

from celery_tasks.sms.tasks import send_sms_code
from meiduo_mall.utils.exceptions import logger

'''

1. 生成和发送短信验证码
2. 保存短信验证码
3. redis pipeline的使用
4. 检查是否在60s内有发送记录
5. Celery异步发送短信
'''

# 短信验证码的路由
#  url('^sms_codes/(?P<mobile>1[3-9]\d{9})/$', views.SMSCodeView.as_view()),


# 定义一个发短信的路由  不对数据库操作所以继承APIView
class SMSCodeView(APIView):
    """
    发送短信验证码
    传入参数：
        mobile, image_code_id, text
        这里接收前端传过来的手机号
    """

    # 定义一个get方法
    def get(self, request, mobile):

        # 3.1 首先连接redis数据库（获取StrictRedis保存数据）sms_codes 是redis的类
        strict_redis = get_redis_connection('sms_codes')  # type: StrictRides

        # 4. 60秒内禁止重复发送短信验证码（为了防止1分钟内多次发送验证码）
        send_flag = strict_redis.get('send_flag_%s' % mobile)

        if send_flag:  # 1分钟内发过则报错
            return Response({'message': '发送短信过于频繁'}, status=400)
            # raise ValidationError({'message': '发送短信过于频繁'})

        # 1. 生成短信验证码
        import random
        sms_code = '%06d'% random.randint(0, 999999)
        logger.info('sms_code: %s'%sms_code)

        # 2.使用云通讯发送短信验证码
        # [sms_code, 5]  [短信验证码， 有效期]   1表示id为1的短信测试模板，项目上线换成自己的模板id
        # CCP().send_template_sms(mobile, [sms_code, 5], 1)   # 短信验证码已通过
        # print('短信的验证码是：%s'%sms_code)
        # 在SMSCodeView通过delay方法发送短信  将函数名 标识等保存到redis中
        # send_sms_code.delay(mobile, sms_code)

        # 使用delay方法调用装饰器的异步任务 （装饰器封装任务 后生成异步任务调用装饰器的方法实现异步 开启线程去执行）
        # 3. 将生成的验证码保存在redis中
        # 3.2 保存短信验证码到Redis expiry 给redis中的验证码加一个过期时间
        strict_redis.setex('sms_%s' % mobile, 5*60, sms_code)     # 验证码在redis中保存5分钟
        # 建立一个游标
        strict_redis.setex('send_flag_%s' % mobile, 60, 1)   	  # 1分钟过期

        return Response({'message': 'ok'})




